/**
  ******************************************************************************
  * @file           : measbase.h
  * @brief          : Header for main.c file.
  *                   This file contains the common defines of the application.
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

#ifndef	_MEASBASE_H_
#define	_MEASBASE_H_

#include "bsp.h"
#include <stdint.h>
#include <stddef.h>

#define MEAS_CALIBRATE_WATI_SAVE_TIMEOUT     12000u
#define MEAS_CALIBRATE_BEEN_SAVED_TIMEOUT    500u
#define MEAS_CALIBRATE_MSGSHOW_TIMEOUT       2000u

#define MEAS_ACC_ALL_CLEAR_KEY               0x5Du

typedef struct _Meas_WtSensorInfoStru
{
  uint64_t sn;                  /* 传感器 称重2 出厂编号 */
  int32_t  srccode;             /* 内码原值,未经移位,未经滤波 */
  uint16_t state;               /* 传感器 称重2 状态 */
  uint32_t range;               /* 传感器 称重2 量程 */
  int16_t  temperature;         /* 传感器 称重2 温度 */
  uint16_t sv;                  /* 传感器 称重2 程序版本*/
}Meas_WtSensorInfoStru;

typedef struct _Meas_SpdSensorInfoStru
{
  uint64_t sn;                  /* 传感器 速度 出厂编号 */
  uint16_t srccode;             /* 内码原值,未经移位,未经滤波 */
  uint16_t reserved;            /* 传感器 速度 速度内码 */
  uint16_t state;               /* 传感器 速度 状态 */
  uint16_t diameter;            /* 传感器 速度 测速轮直径 */
  uint16_t gears;               /* 传感器 速度 齿数 */
  int16_t  temperature;         /* 传感器 速度 温度 */
  uint16_t sv;                  /* 传感器 速度 程序版本*/
}Meas_SpdSensorInfoStru;

/* 传感器AD原始数据 */
typedef struct _Meas_AdRawStru
{
  int32_t  wad_unified;          /* 重量内码归一值 */
  int32_t  wad_divided[4];       /* 重量内码 4个传感器分立值 经过移位和滤波后的值 */
  uint16_t sad_hz;
  uint16_t sad_100hz;
}Meas_AdRawStru;

/* 外部输入的控制变量 如一些控制按键 DO控制等 */
typedef struct _Meas_ExternalControlsStru
{
  volatile uint8_t manual_zero_stop_key;   /* 1有效,其他值无效,停止按钮信号 在整个调零状态机中 始终有效 */
  volatile uint8_t manual_zero_save_key;

  volatile uint8_t cal_guama_stop_key;
  volatile uint8_t cal_guama_save_seg_key;  /* 标定当前段 按钮 */
  volatile uint8_t cal_guama_save_all_key;  /* 标定全部段 按钮 */

  volatile uint8_t cal_shiwu_passed_key;
  volatile uint8_t cal_shiwu_stop_key;
  volatile uint8_t cal_shiwu_save_seg_key;  /* 标定当前段 按钮 */
  volatile uint8_t cal_shiwu_save_all_key;  /* 标定全部段 按钮 */

  volatile uint8_t cal_lianma_stop_key;
  volatile uint8_t cal_lianma_save_key;

  volatile uint8_t total_acc_clear_key;
  volatile uint8_t year_acc_clear_key;
  volatile uint8_t month_acc_clear_key;
  volatile uint8_t day_acc_clear_key;
  volatile uint8_t class_acc_clear_key;
  volatile uint8_t acc_all_clear_key;
  volatile uint8_t factory_reset;

  volatile uint8_t local_do01;
  volatile uint8_t local_do02;
  volatile uint8_t local_do03;
  volatile uint8_t local_do04;
}Meas_ExternalControlsStru;

/* 内部状态变量 如标志位 */
typedef struct _Meas_InternalStateStru
{
  volatile uint8_t calzero_msg;  /*  用于和屏幕ui同步显示消息的变量 */
  volatile uint8_t calgm_msg;    /*  用于和屏幕ui同步显示消息的变量 */
  volatile uint8_t calsw_msg;    /*  用于和屏幕ui同步显示消息的变量 */

  volatile uint8_t local_di01;
  volatile uint8_t local_di02;
  volatile uint8_t local_di03;
  volatile uint8_t local_di04;
}Meas_InternalStateStru;

/* 计算变量 如输出计算结果等 */
typedef struct _Meas_CalculateStru
{
  uint16_t ssp_state;
  uint16_t main_state_machine;              /* 主板状态 Meas_MainStateMachineEnum */
  uint32_t cpu_runtime;
  uint32_t error_code;

  uint16_t ao1;
  uint16_t ao2;
  uint16_t current_class;
  uint16_t speed_code_ave;
  int32_t  weight_code_ave;
  float    belt_load_gm;
  float    belt_speed_mms;
  double   flowrate_kgh;                    /* 流量kg/h 改为int32_t */
  double   flowrate_0d1g_0d01s;             /* 流量kg/h 改为int32_t */

  /* 累计示值 且被分度值转换 以kg为基础 */
  uint32_t day_acc_kg;
  uint32_t hour_acc_kg;
  uint32_t pulse_acc_kg;                    /* 脉冲累计 kg */
  uint32_t class01_acc_kg;
  uint32_t class02_acc_kg;
  uint32_t class03_acc_kg;
  uint32_t class04_acc_kg;
  uint32_t day_acc_last_kg;
  uint32_t hour_acc_last_kg;
  uint64_t interval_acc_kg;               /* 间隔参量 数据FRAM不保存 */
  uint32_t class01_acc_last_kg;
  uint32_t class02_acc_last_kg;
  uint32_t class03_acc_last_kg;
  uint32_t class04_acc_last_kg;
  uint64_t total_acc_kg;
  uint64_t year_acc_kg;
  uint64_t month_acc_kg;
  uint64_t total_acc_last_kg;
  uint64_t year_acc_last_kg;
  uint64_t month_acc_last_kg;
  
  /* 挂码校验用 */
  uint16_t calgm_substmachine;              /* 挂码校验子状态机 */
  uint32_t calgm_wtfactor_adjust;           /* 挂码校验基础系数调整值 */
  int32_t  calgm_wtfactor_correct;          /* 挂码校验系数修正值 */
  uint32_t calgm_belt_remainder_mm;         /* 挂码校验皮带剩余长度 */
  uint32_t calgm_belt_remainder_0d01s;      /* 挂码校验皮带剩余时间 */
  uint32_t calgm_elapsed_time_0d01s;        /* 挂码校验已经运行的时间 0.01s */
  uint64_t calgm_elapsed_pulse;             /* 挂码校验已经运行的脉冲数 */
  int64_t  calgm_actual_total_0d1g;         /* 挂码校验实际累计量 */
  uint64_t calgm_theory_total_0d1g;         /* 挂码校验理论累计量 */

  /* 实物校验用 */
  uint16_t calsw_substmachine;              /* 实物校验子状态机 */
  uint16_t calsw_elapsed_belt_cnt;          /* 从校验开始至今皮带转过整圈的次数 */
  uint32_t calsw_wtfactor_adjust;           /* 实物校验基础系数调整值 */
  int32_t  calsw_wtfactor_correct;          /* 实物校验系数修正值 */
  uint32_t calsw_belt_remainder_mm;         /* 实物校验皮带剩余长度 */
  uint32_t calsw_belt_remainder_0d01s;      /* 实物校验皮带剩余时间 */
  uint32_t calsw_elapsed_time_0d01s;        /* 实物校验已经运行的时间 0.01s */
  uint64_t calsw_elapsed_pulse;             /* 实物校验已经运行的脉冲数 */
  int64_t  calsw_actual_total_0d1g;         /* 实物校验实际累计量 */

  /* 手动调零用 */
  uint16_t calmzero_substmachine;           /* 手动调零子状态机 */
  uint16_t calmzero_elapsed_belt_cnt;       /* 从手动调零开始至今皮带转过整圈的次数 */
  int32_t  calmzero_zero_adjust1;           /* 手动调零当前圈零点内码调整值 */
  int32_t  calmzero_zero_adjust2;           /* 手动调零上一圈零点内码调整值 */
  uint32_t calmzero_belt_remainder_mm;      /* 手动调零皮带剩余长度 */
  uint32_t calmzero_belt_remainder_0d01s;   /* 手动调零皮带剩余时间 */
  uint32_t calmzero_elapsed_time_0d01s;     /* 手动调零已经运行的时间 0.01s */
  uint32_t calmzero_elapsed_adcnt;          /* 手动调零内码累加次数 */
  uint64_t calmzero_elapsed_pulse;          /* 手动调零已经运行的脉冲数 */
  int64_t  calmzero_wad_add;                /* 手动调零重量内码累加值 */

  /* 自动调零用 */
  int32_t  autozero_zero_adjust;            /* 自动调零本圈零点内码调整值 */
  uint32_t autozero_elapsed_time_0d01s;     /* 自动调零已经运行的时间 0.01s */
  uint32_t autozero_elapsed_adcnt;          /* 自动调零内码累加次数 */
  uint64_t autozero_elapsed_pulse;          /* 自动调零已经运行的脉冲数 */
  int64_t  autozero_wad_add;                /* 自动调零重量内码累加值 */

  uint16_t calibrate_timeout;               /* 校验成功时的超时 */

  uint16_t str_sn[12];
  uint16_t str_sv[12];
  uint16_t str_pv[12];
  uint16_t str_uv[12];
  uint16_t str_bd[12];

  /* 累计原始值 */
  uint64_t interval_acc_0d1g;               /* 间隔参量 数据FRAM不保存 */
  uint64_t total_acc_0d1g;
  uint64_t year_acc_0d1g;
  uint64_t month_acc_0d1g;
  uint64_t day_acc_0d1g;
  uint64_t hour_acc_0d1g;
  uint64_t pulse_acc_0d1g;                   /* 脉冲累计 0.1g */
  uint64_t class01_acc_0d1g;
  uint64_t class02_acc_0d1g;
  uint64_t class03_acc_0d1g;
  uint64_t class04_acc_0d1g;

  uint64_t total_acc_last_0d1g;
  uint64_t year_acc_last_0d1g;
  uint64_t month_acc_last_0d1g;
  uint64_t day_acc_last_0d1g;
  uint64_t hour_acc_last_0d1g;
  uint64_t class01_acc_last_0d1g;
  uint64_t class02_acc_last_0d1g;
  uint64_t class03_acc_last_0d1g;
  uint64_t class04_acc_last_0d1g;

  Meas_SpdSensorInfoStru spd_sensor_info;
  Meas_WtSensorInfoStru  wt_sensor_info[4];
  
  Sys_DataTimeStru wtacc_total_last_switch; /* 上次总累计清零切换日期 */
  Sys_DataTimeStru wtacc_year_last_switch;  /* 上次年累计清零切换日期 */
  Sys_DataTimeStru wtacc_month_last_switch; /* 上次月累计清零切换日期 */
  Sys_DataTimeStru wtacc_day_last_switch;   /* 上次日累计清零切换日期 */
  Sys_DataTimeStru wtacc_hour_last_switch;  /* 上次小时累计清零切换日期 */
  Sys_DataTimeStru wtacc_class_last_switch; /* 上次班累计清零切换日期 */
}Meas_CalculateStru;

/* 中间临时变量,用于计算的中间过程 */
typedef struct _Meas_TemporaryStru
{
  volatile uint16_t sensor_full_info;       /* 传感器完全信息读取开关 1开0关 */
  
  volatile uint16_t total_acc_clear_flg;
  volatile uint16_t year_acc_clear_flg;
  volatile uint16_t month_acc_clear_flg;
  volatile uint16_t day_acc_clear_flg;
  volatile uint16_t hour_acc_clear_flg;
  volatile uint16_t class_acc_clear_flg;
}Meas_TemporaryStru;

/* 外部输入变量 如参数等 */
typedef struct _Meas_ParameterStru
{
  uint32_t local_number;                    /* 本机编号 */
  uint32_t measuring_range_tph;             /* 量程 t/h */
  uint16_t main_display_pos1;               /* 首页位置1显示 0班累计 1日累计 2月累计 3年累计 */
  uint16_t main_display_pos2;               /* 首页位置2显示 0流量 1载荷 2速度 */
  uint16_t refresh_rate;                    /* 显示刷新率 1~20 */
  /* 计量参数 */
  uint16_t wad_preset_enable;               /* 重量内码内给开关 */
  uint16_t sad_preset_enable;               /* 速度内码内给开关 */
  uint16_t sad_preset_value;                /* 速度内码内给值 */
  uint16_t speed_low_limit;                 /* 实测速度内码下限 */
  int16_t  flowrate_lowlim_kgh;             /* 有效流量下限 t/h */
  uint16_t auto_zero_range;                 /* 自动调零强度 */
  uint16_t factor_correct_enable;           /* 系数修正使能 */
  uint32_t weight_factor_base;              /* 称量系数基础值 */
  int32_t  weight_factor01;                 /* 称量系数修正01 (  >1600   t/h) */
  int32_t  weight_factor02;                 /* 称量系数修正02 (1200~1600 t/h) */
  int32_t  weight_factor03;                 /* 称量系数修正03 (800~1200  t/h) */
  int32_t  weight_factor04;                 /* 称量系数修正04 (400~800   t/h) */
  int32_t  weight_factor05;                 /* 称量系数修正05 (  <400    t/h) */
  int32_t  zero_code_ave;                   /* 零点总平均内码 */
  int32_t  wad_preset_value;                /* 重量内码内给值 */
  /*累计参数*/
  uint16_t division_kg;                     /* 累计分度值 kg divisionenum */
  uint16_t num_of_class;                    /* 当日班数 */
  uint16_t year_begin_zero;                 /* 年累计起始点 */
  uint16_t month_begin_zero;                /* 月累计起始点 */
  uint16_t day_begin_zero;                  /* 日累计起始点 */
  uint32_t acc_class01_start_time;          /* 班01累计起止时间 */
  uint32_t acc_class02_start_time;          /* 班02累计起止时间 */
  uint32_t acc_class03_start_time;          /* 班03累计起止时间 */
  uint32_t acc_class04_start_time;          /* 班04累计起止时间 */
  /* 传感器参数 */
  uint16_t spd_sensor_addr;                 /* 传感器 速度  地址 */
  uint16_t wt1_sensor_addr;                 /* 传感器 称重1 地址 */
  uint16_t wt2_sensor_addr;                 /* 传感器 称重2 地址 */
  uint16_t wt3_sensor_addr;                 /* 传感器 称重3 地址 */
  uint16_t wt4_sensor_addr;                 /* 传感器 称重4 地址 */
  /* 接口参数 */
  uint16_t ao1_zero_code;                   /* ao1零点内码(pwm值) */
  uint16_t ao1_full_code;                   /* ao1满度内码(pwm值) */
  uint16_t ao2_zero_code;                   /* ao2零点内码(pwm值) */
  uint16_t ao2_full_code;                   /* ao2满度内码(pwm值) */
  uint16_t weight_pulse_wide;               /* 定量脉冲开关及宽度 ms */
  uint32_t weight_pulse_set_kg;             /* 定量累计设定 kg */
  /* 校验参数 */
  uint16_t manu_zero_range;                 /* 手动调零强度 */
  uint16_t len_circle_mode;                 /* 整圈方式 */
  uint16_t speed_wheel_cir_0d1mm;           /* 测速轮周长 0.1mm */
  uint16_t speed_wheel_pls;                 /* 测速轮每周脉冲 */
  int32_t  zero_code_uplimit;               /* 零点内码上限 */
  uint32_t belt_period_0d01s;               /* 皮带周期 0.1s */
  uint32_t belt_length_mm;                  /* 皮带周长 mm */
  uint32_t effect_length_mm;                /* 称量长度 mm */
  uint32_t cal_fama_weight_0d1g;            /* 校验砝码重量 g */
  uint32_t cal_shiwu_weight_kg;             /* 校验实物重量 kg */
  uint16_t cal_shiwu_wtacc;                 /* 校验实物重量是否计入产量 */
  uint32_t cal_lianma_denser_0d1gpm;        /* 校验链码密度 g/m */
  /* 产量监控网络收发参数 */
  uint32_t prod_city_num;                   /* 市名/编号 */
  uint32_t prod_county_num;                 /* 县名/编号 */
  uint32_t prod_mines_num;                  /* 矿名/编号 */
  uint32_t prod_year_capacity_t;            /* 核定年生产能力 */
  uint32_t prod_month_capacity_t;           /* 核定月生产能力 */
  uint32_t prod_day_capacity_t;             /* 核定日生产能力 */
  uint32_t prod_hour_capacity_t;            /* 核定时生产能力 */
  uint32_t prod_interval_time_s;            /* 间隔参量时间 也是上传时间 s */
  uint32_t prod_net_timeout_s;              /* 产量网络发送超时时间 s */
  /* 网络参数设置 */
  uint8_t  eth_local_ip[4];                 /* 本机IP */
  uint8_t  eth_local_gw[4];                 /* 网关 */
  uint8_t  eth_local_msk[4];                /* 子网掩码 */
  uint8_t  eth_local_mac[6];                /* 本机MAC */

  uint8_t  eth_produp_ip[4];                /* 间隔参量上传 目标服务器ip */
  uint8_t  eth_prodrt_ip[4];                /* 实时参量上传 目标服务器ip */
  uint8_t  eth_mbtcp_ip[4];                 /* modbusTCP  目标服务器ip */
  uint16_t eth_produp_port;                 /* 间隔参量上传 目标服务器端口 */
  uint16_t eth_prodrt_port;                 /* 实时参量上传 目标服务器端口 */
  uint16_t eth_mbtcp_prot;                  /* modbusTCP  目标服务器端口 */

  /* 时间 系统时间,可从其他源获取时间,并修改系统时间同步至屏幕 */
  uint16_t dttm_second;
  uint16_t dttm_minute;
  uint16_t dttm_hour;
  uint16_t dttm_day;
  uint16_t dttm_month;
  uint16_t dttm_year;
}Meas_ParameterStru;

typedef enum _Meas_AbleEnum
{
  MEAS_UNLOCK = 0,
  MEAS_LOCK   = 1,
}Meas_AbleEnum;

typedef enum _Meas_ReturnEnum
{
  RET_RUNNING = 0,
  RET_SUCCESS,
  RET_FAIL,
  RET_EXIT,
}Meas_ReturnEnum;

typedef enum
{
  MEAS_STATMACH_GOON = 0,
  MEAS_STATMACH_EXIT = 1,
}Meas_StateMachineReturnEnum;

typedef enum
{
  MEAS_CURRENT_CLASS_01 = 0x0000u,
  MEAS_CURRENT_CLASS_02 = 0x0003u,
  MEAS_CURRENT_CLASS_03 = 0x0005u,
  MEAS_CURRENT_CLASS_04 = 0x0009u,
  MEAS_CURRENT_CLASS_05 = 0x0011u,
}Meas_CurrentClassEnum;

typedef enum _Meas_LenCircleModeEnum
{
  MEAS_LEN_CIRCLE_FIXTIME = 0,
  MEAS_LEN_CIRCLE_FIXLENG = 1,
}Meas_LenCircleModeEnum;

typedef enum _Meas_AccBeginZeroEnum
{
  MEAS_ACC_BEGIN_ZERO_CLASS = 0,
  MEAS_ACC_BEGIN_ZERO_0H0M = 1,
}Meas_AccBeginZeroEnum;

typedef enum
{
  MEAS_BEGIN_ZERO_0H0M0S   = 0,             /* 0时0分0秒  */
  MEAS_BEGIN_ZERO_CLASS01ST = 1,             /* 班计时最早 */
}Meas_BeginZeroEnum;

typedef enum _Meas_ShiwuWtaccEnum
{
  MEAS_SHIWU_WTACC_NO  = 0,             /* 实物计不入产量 */
  MEAS_SHIWU_WTACC_YES = 1,             /* 实物计入产量 */
}Meas_ShiwuWtaccEnum;

typedef enum _Meas_FactorCorrectEnum
{
  MEAS_FACTOR_CORRECT_DISABLE  = 0,      /* 称量系数修正关闭 */
  MEAS_FACTOR_CORRECT_ENABLE = 1,        /* 称量系数修正使能 */
}Meas_FactorCorrectEnum;

typedef enum _Meas_MainStateMachineEnum
{
  MEAS_MAIN_STATE_MACHINE_IDLE = 0,
  MEAS_MAIN_STATE_MACHINE_MEASURING,
  MEAS_MAIN_STATE_MACHINE_MZERO,
  MEAS_MAIN_STATE_MACHINE_CALGM,
  MEAS_MAIN_STATE_MACHINE_CALSW,
  MEAS_MAIN_STATE_MACHINE_CALLM,
}Meas_MainStateMachineEnum;

typedef enum _Meas_MZeroSubStateMachineEnum
{
  MZERO_SUB_STATE_MACHINE_INIT = 0,
  MZERO_SUB_STATE_MACHINE_PROCESS,
  MZERO_SUB_STATE_MACHINE_WAITSAVE,
  MZERO_SUB_STATE_MACHINE_SENDMSG,
  MZERO_SUB_STATE_MACHINE_EXIT,
}Meas_MZeroSubStateMachineEnum;

typedef enum _Meas_CalGMSubStateMachineEnum
{
  CALGM_SUB_STATE_MACHINE_INIT = 0,
  CALGM_SUB_STATE_MACHINE_PROCESS,
  CALGM_SUB_STATE_MACHINE_WAITSAVE,
  CALGM_SUB_STATE_MACHINE_SENDMSG,
  CALGM_SUB_STATE_MACHINE_EXIT,
}Meas_CalGMSubStateMachineEnum;

typedef enum _Meas_CalSWSubStateMachineEnum
{
  CALSW_SUB_STATE_MACHINE_INIT = 0,
  CALSW_SUB_STATE_MACHINE_PROCESS,
  CALSW_SUB_STATE_MACHINE_WAITSAVE,
  CALSW_SUB_STATE_MACHINE_SENDMSG,
  CALSW_SUB_STATE_MACHINE_EXIT,
}Meas_CalSWSubStateMachineEnum;

/* 分度值 枚举 */
typedef enum
{
  MEAS_DIVISION_1    = 1,
  MEAS_DIVISION_2    = 2,
  MEAS_DIVISION_5    = 5,
  MEAS_DIVISION_10   = 10,
  MEAS_DIVISION_20   = 20,
  MEAS_DIVISION_50   = 50,
  MEAS_DIVISION_100  = 100,
  MEAS_DIVISION_200  = 200,
  MEAS_DIVISION_500  = 500,
  MEAS_DIVISION_1000 = 1000,
}Meas_DivisionEnum;

#endif /* _MEASBASE_H_ */
